package chapter3.lessons.copyPart;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Project ：learn_java
 * @File ：CopyDemo01version2.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/2/28 20:11
 * @Description ：CopyDemo01.java的优化版本
 */

public class CopyDemo01version2 {
    public static void main(String[] args) {
        // 定义数据源文件路径
        String sourceFilePath = "images/nz.jpeg";
        // 定义目标文件路径
        String destinationFilePath = "IOTestOutputFiles/nz2.jpeg";

        // 使用 try-with-resources 语句，它会自动关闭流，避免手动调用 close() 方法
        try (FileInputStream fis = new FileInputStream(sourceFilePath);
             FileOutputStream fos = new FileOutputStream(destinationFilePath)) {

            // 读取源文件的每个字节并写入目标文件
            // 这种单个字节读取的方法只适合小文件，通常是几kb左右
            // 对于大文件，建议使用缓冲区来提高性能，代码如下：
            /*
            try (BufferedInputStream bis = new BufferedInputStream(fis);
                 BufferedOutputStream bos = new BufferedOutputStream(fos)) {
                int byteRead;
                while ((byteRead = bis.read()) != -1) {
                    bos.write(byteRead);
                }
            }
            */
            int byteRead;
            while ((byteRead = fis.read()) != -1) {
                fos.write(byteRead);
            }

            System.out.println("文件复制成功。");
        } catch (IOException e) {
            if (e.getMessage().contains(sourceFilePath)) {
                System.err.println("无法打开源文件: " + sourceFilePath);
            } else if (e.getMessage().contains(destinationFilePath)) {
                System.err.println("无法打开目标文件: " + destinationFilePath);
            } else {
                System.err.println("文件复制过程中出现错误: " + e.getMessage());
            }
        }
    }
}
